.TITLE AFSUB .IDENT /01.02/ ; ; Copyright (c) 1995 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION 01.01 ; ; J. E. PROVINO 18-JUL-78 ; ; MODIFIED BY: ; ; B. S. MCCARTHY 10-JUN-81 ; ; BM122 -- REMOVAL OF TASK HEADERS FROM PRIMARY POOL ; ; D. Carroll 18-Oct-1995 ; DC404 - Include PSECT statement to allow ICB pool to be ; fully expanded during sysgen ; ; ; CPU AFFINITY COMMON SUBROUTINES ; ;+ ; **-$TSTAT-TEST AFFINITY (SPECIFY TCB) ; **-$TSTAP-TEST AFFINITY (SPECIFY PCB) ; **-$TSTAM-TEST AFFINITY (SPECIFY MASK) ; ; THESE ROUTINES DETERMINE IF A SPECIFIED RUN MASK IS VALID. ; ; INPUTS: ; ; R0=TCB ADDRESS ($TSTAT) ; PCB ADDRESS ($TSTAP) ; RUN MASK ($TSTAM) ; ; OUTPUTS: ; ; C=1 IF RUN MASK IS INVALID ; C=0 IF RUN MASK IS VALID ;- ;DC404 .IIF DF,K$$DAS&I$$CBP, .PSECT EXEC1 ;DC404 .IF DF M$$PRO .ENABL LSB $TSTAT::MOV R0,-(SP) ;SAVE TCB ADDRESS MOV T.RRM(R0),R0 ;GET TCB RUN MASK BR 10$ ;GO TO COMMON CODE $TSTAP::MOV R0,-(SP) ;SAVE PCB ADDRESS MOV P.RRM(R0),R0 ;GET PCB RUN MASK BR 10$ ;GO TO COMMON CODE $TSTAM::MOV R0,-(SP) ;SAVE RUN MASK 10$: MOV R1,-(SP) ;SAVE R1 MOV $URMST,R1 ;GET URM STATUS WORD COM R1 ;COMPLEMENT IT BIT R0,R1 ;ARE THE SPECIFIED RUNS ONLINE? BNE 40$ ;NO IF NE MOV #<-2>,R1 ;POINT TO TABLE ENTRY FOR LAST PROCESSOR 20$: CLC ;ASSUME RUN MASK IS VALID BIT $BTMSK(R1),$URMST ;IS THIS CPU ONLINE? BEQ 30$ ;NO IF EQ BIT $CRMTB(R1),R0 ;IS MASK VALID ON THIS PROCESSOR? BEQ 50$ ;YES IF EQ 30$: SUB #2,R1 ;POINT TO NEXT TABLE ENTRY BGE 20$ ;MORE ENTRIES IF GE 40$: SEC ;RUN MASK IS INVALID 50$: MOV (SP)+,R1 ;RESTORE REGISTERS MOV (SP)+,R0 ; RETURN .DSABL LSB ;+ ; **-SETAT-SET UP REQUIRED RUN MASK (TCB SPECIFIED) ; **-SETAP-SET UP REQUIRED RUN MASK (PCB SPECIFIED) ; **-SETAH-SET UP REQUIRED RUN MASK (HEADER SPECIFIED) ; ; THESE ROUTINES SET UP THE REQUIRED RUN MASK IN THE CALLING TASK'S TCB ; ; INPUTS: ; ; R0=TCB ADDRESS ($SETAT) ; PCB ADDRESS ($SETAP) ; HEADER ADDRESS ($SETAH) ; ; OUTPUTS: ; ; T.RRM IS SET UP IN THE TCB ;- $SETAT::MOV T.PCB(R0),R0 ;GET ADDRESS OF TASK REGION PCB $SETAP:: ;REFERENCE LABEL .IF DF X$$HDR MOV KISAR6,-(SP) ;SAVE PREVIOUS MAPPING MOV P.HDR(R0),-(SP) ;GET ADDRESS OF HEADER BNE 5$ ;IF NE HEADER IS RESIDENT MOV P.REL(R0),KISAR6 ;MAP TO NONRESIDENT HEADER MOV #140000,(SP) ;SET VIRTUAL ADDRESS OF HEADER 5$: MOV (SP)+,R0 ;GET VIRTUAL ADDRESS OF HEADER CALL $SETAH ;USE HEADER SPECIFIED ROUTINE MOV (SP)+,KISAR6 ;RESTORE PREVIOUS MAPPING RETURN ; .IFF ; DF X$$HDR MOV P.HDR(R0),R0 ;GET ADDRESS OF HEADER .ENDC ; DF X$$HDR $SETAH::MOV R1,-(SP) ;SAVE REGISTERS MOV R2,-(SP) ; MOV R3,-(SP) ; CLR -(SP) ;CLEAR CALCULATED RUN MASK MOV H.WND(R0),R0 ;POINT TO THE NUMBER OF WINDOW BLOCKS MOV (R0)+,-(SP) ;SAVE THE NUMBER OF WINDOWS MOV (R0),R3 ;SAVE TASK REGION PCB ADDRESS 10$: MOV (R0),R1 ;IS THIS WINDOW MAPPED? BEQ 20$ ;NO IF EQ BIS P.RRM(R1),2(SP) ;CALCULATE REQUIRED RUN MASK 20$: ADD #W.BLGH,R0 ;POINT TO NEXT WINDOW DEC (SP) ;ANY WINDOWS LEFT? BGT 10$ ;YES IF GT MOV P.TCB(R3),R0 ;POINT TO TASK TCB TST (SP)+ ;CLEAN THE STACK MOV (SP)+,T.RRM(R0) ;MOVE CALCULATED RUN MASK TO THE TCB MOV (SP)+,R3 ;RESTORE REGISTERS MOV (SP)+,R2 ; MOV (SP)+,R1 ; RETURN .ENDC .END